/**
 * Implementaci�n de una ventana abstracta que muestra un formulario de captura de informaci&oacute;. 
 * @class Extmx.WindowForm 
 * Ventana preconfigurada para encapsular un formulario, con botones de aceptar y cancelar, barra de estado para mostrar mensajes
 * 
 * @extends Extmx.WindowStatusBar
 * @autor Ing. Josu� Hern�ndez G�mez<br>
 *        joshua@extjs.mx<br>
 *        http://www.joshua.com.mx
 * @fecha 22 de octubre 2010. Oaxaca, M&eacute;xico
 * 
 */
Ext.ns("Extmx.WindowForm");
Extmx.WindowForm= Ext.extend(Extmx.ModalWindow,{
    /**
	 * @cfg String layout Por defecto tiene "fit"
	 */
    layout:"fit",
	
    /**
	 * @cfg String iconAdd Clase de css que define al icono de la ventana al abrirse para "Agregar"
	 */
    iconAdd:"",
	
    /**
	 * @cfg String iconMod Clase de css que define al icono de la ventana al abrirse para "Modificar" o "Editar"
	 */
    iconMod:"",
	
    /**
	 * @cfg String titleAdd T&iacute;tulo de la ventana al abrirse para "Agregar"
	 */
    titleAdd:"",
	
    /**
	 * @cfg String titleMod T&iacute;tulo de la ventana al abrirse para "Modificar"
	 */
    titleMod:"",
	
    /**
	 * @cfg Boolean monitorValid Cuando esta en true, valida el formulario actualizando los mensajes en la barra. Ejecuta el m&eacute;todo
	 * validate que debe implementar el formulario 
	 * de estado
	 */
    monitorValid : false,

    monitorTime: 7000,

    txtBtnGuardar:'Guardar',

    txtIconClsGuardar:"save",
	
    initComponent: function (){
    /*
        if (Ext.isEmpty(this.form)) {
            throw "Extmx.WindowForm requiere un formulario";
            return;
        }
        if (Ext.isEmpty(this.form.cargar)) {
            throw "El formulario de WIndowForm debe implementar el metodo cargar";
            return;
        }*/

        if(Ext.isEmpty(this.xtypeForm))
        //si no tiene xtypeForm
            this.items= this.items || this.form;
        else
		    this.items= Ext.apply({
                xtype: this.xtypeForm
            }, this.configForm || {});

        Ext.apply(this, {
            buttons: this.getButtons()
        });
        Extmx.WindowForm.superclass.initComponent.apply(this,arguments);
			
        this.on({
            scope:this,
            close: this.detenerValidator,
            hide: this.detenerValidator,
            render: function (){
                //log(this.items);return;
                this.form= this.items.items[0];

                this.form.on({
                    scope:this,
                    cargado: function (){
                        this.unmask();
                    },
                    agregado: function (){
                        this.onCancelar.defer(100,this);
                    }
                });

                this.relayEvents(this.form, [
                    /**
                     * @event agregado
                     * Se copia el evento agregado del formulario encapsulado
                     * @param {Extmx.FormPanel} form El formulario encapsulado
                     * @param {Object} values Se hace un getForm().getValues() al formulario
                     */
                    "agregado"]);
            }
        });
    },


    getButtons: function (){
        return [{
                iconCls:this.txtIconClsGuardar,
                text:this.txtBtnGuardar,
                id:"save"+this.id,
                scope:this,
                handler: this.onGuardar
            },{
                text: 'Cancelar',
                iconCls:"delete",
                id:"cancel"+this.id,
                scope:this,
                handler: this.onCancelar
            }];
    },

    //private detener las validaciones
    detenerValidator: function (){
        if(!Ext.isEmpty(this.validador))
            this.validador.stop(this.validar);
    },
    
    
    onDestroy: function (){
        this.detenerValidator();
        Extmx.WindowForm.superclass.onDestroy.call(this);
    },
    
    
    /**
    * @method onGuardar Funci�n ejecutada al presionar el bot�n guardar. Valida que el formulario sea correcto. 
    * @param {Object} record (optional) Identificador o record que se le pasa a la funcion cargar del formulario, para cargar los datos del record en el 
    **/
    onGuardar:function (){
        if(this.form.isValid()){
            //si el formulario es valido
            this.mascara();
            this.form.submit();
        }
    },
	
    /**
    * @method onCancelar Funci�n ejecutada al presionar el bot�n cancelar. Esconde la ventana
    **/
    onCancelar:function (){
        if(this.closeAction=="hide")
            this.hide();
        else
            this.close();
    },

    /**
    * @method show Muestra la ventana. Dispara el evento agregar(No recibe parametro) o modificar (recibe un par�metro)
    * @param {Object} record (optional) Identificador o record que se le pasa a la funcion cargar del formulario, para cargar los datos del record en el 
    **/
    show: function (record){
        Extmx.WindowForm.superclass.show.call(this);
        this.form.reset();
        this.unmask();
        if(Ext.isEmpty(record))
            this.setTitle( this.titleAdd, this.iconAdd );
        else{
            this.setTitle( this.titleMod, this.iconMod );
            this.mascara('Cargando datos...');
            this.form.cargar(record);
        }
		
        //validar el formulario cada 6 segundos despues de 10 segundos
        var _this= this;
        setTimeout(function (){
            if(_this.isVisible() && _this.monitorValid )
                //si la ventana esta mostrada
                _this.activarValidador();
        },15000);
    },
	
    /**
    * @method mascara Enmascara el cuerpo de la ventana. Inhabilita los botones. Establece el mensaje de cargando en el status bar
    **/
    mascara: function (){
        this.body.mask(" Por favor espere...");

        Ext.getCmp("save"+this.id).disable();
        Ext.getCmp("cancel"+this.id).disable();
    },
	
    /**
    * @method unmask Desenmascara el cuerpo de la ventana. Habilita los botones. Establece el mensaje de listo en el status bar
    **/
    unmask: function (){
        this.body.unmask();
        Ext.getCmp("save"+this.id).enable();
        Ext.getCmp("cancel"+this.id).enable();
    },
	
    activarValidador: function (){
        var _this= this;
        if(Ext.isEmpty(this.validador)){
            //si el validador no ha sido creado
            this.validador= new Ext.util.TaskRunner();
            this.validar= {
                run: function(){
                    if(_this.monitorValid){
                        _this.form.validate();
                    }
                },
                interval: 5000 //5 second
            }
        }
        this.validador.start(this.validar);
    }
});